/**
 * 处理返回值的错误信息
 * 转换成Json格式
 */
import { Context, Next } from 'koa';
import LogConfig from "/Config/Log";

export default () => async (ctx: Context, next: Next) => {

    await next().catch((err: any) => {
        let ctxPath = ctx.path;
        if (ctxPath.length > 30) ctxPath = `${ctxPath.slice(0, 26)}...${ctxPath.slice(26, 31)}`;
        if (!Array.isArray(err)) {
            ctx.status = err.status || 500;
            const { controller, apiName } = ctx.reqPath;
            if (!ctx.isRouteStrong) {
                logger.error(`[控制器 ${ctxPath}] ${controller} 下的 ${apiName} 方法拒绝了当前请求!返回:[${ctx.status}] ${err.message}`);
            } else {
                logger.error(`[强路由 ${ctxPath}] ${controller ? `${controller} 下的 ${apiName}  ` : '自定义函数'} 拒绝了当前请求！返回:[${ctx.status}] ${err.message}`);
            }
            if (process.env.NODE_ENV === 'development') {
                // 开发环境才会提示详细的
                console.error(err);//开发环境打印错误信息
                ctx.body = {
                    code: err.status,
                    msg: err.message,
                    errors: err.errors || null,
                };
            } else {
                // 生产环境直接返回错误信息
                ctx.body = err.message;
            }
            return;
        }
        // 抛出200代码，通常是逻辑拒绝的  
        ctx.status = 200;
        ctx.body = {
            code: err[0] || 500,
            msg: err[1] || '服务器拒绝',
        };
        if (LogConfig.isThrowOpen) {
            const { controller, apiName } = ctx.reqPath;
            if (!ctx.isRouteStrong) {
                logger.warn(`[控制器 ${ctxPath}] ${controller} 下的 ${apiName} 方法拒绝了当前请求!返回: ${JSON.stringify(ctx.body)}`);
            } else {
                logger.warn(`[强路由 ${ctxPath}] ${controller ? `${controller} 下的 ${apiName}  ` : '自定义函数'} 拒绝了当前请求！返回: ${JSON.stringify(ctx.body)}`);
            }
        }

    });
}


